const express = require('express');
// 跨域中间件
const cors = require('cors');
// 数据验证中间件
const joi = require('joi');
// 解析token的中间件
const expressJWT = require('express-jwt');
// 导入配置文件
const config = require('./config');
const path = require('path')

const userRouter = require('./router/user');
const userinfoRouter = require('./router/userinfo');
const artcateRouter = require('./router/artcate');
const articleRouter = require('./router/article');

// 创建 express 的服务器实例
const app = express();

// 静态文件服务共享
app.use('/public',express.static(path.join(__dirname + '/public/images')));

// 将 cors 注册为全局中间件，跨域资源共享
app.use(cors());
// 配置解析 application/x-www-form-urlencoded 格式的表单数据的中间件：
app.use(express.urlencoded({ extended: false }))
// 响应数据的中间件
app.use((req, res, next) => {
  res.cc = function (err, status = 1) {
    res.send({
      status,
      message: err instanceof Error ? err.message : err,
    })
  }
  next();
})
// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
app.use(expressJWT({ secret: config.jwtSecretKey, algorithms: ['HS256'] }).unless({ path: [/^\/api\//] }));

// 注册用户路由模块
app.use('/api', userRouter);
app.use('/my', userinfoRouter);
app.use('/my/article', artcateRouter);
app.use('/my/article', articleRouter);

// 错误中间件
app.use((err, req, res, next) => {
  // 数据验证失败joi
  if (err instanceof joi.ValidationError) {
    return res.cc(err);
  }
  // 捕获身份认证失败的错误token
  if (err.name === 'UnauthorizedError') {
    return res.cc('身份认证失败！');
  }
  // 未知错误
  res.cc(err);
})

// 调用 app.listen 方法，指定端口号并启动web服务器
app.listen(3007, () => {
  console.log('api server is running at http://127.0.0.1:3007');
})